最近在学习 java 。 看java 入门到精通 。在反射部分 突然对以前不懂的 依赖注入 豁然开朗
依赖注入 就是通过反射 去获取对象中需要的参数 类
下面是模仿laravel 实现过程 。比较 low
原创 转载请注明出处
<?php
/**
* 依赖注入取决的 就是 容器和反射 两个部分
* 可以考虑一个服务提供者
* 然后 在服务提供者进行注册
* 服务提供者 在生命周期内
* 进行注册 或者其他的操作
* 需要实现接口
* 接口 register 为注册 handle 为执行 boot 为监听
*/
namespace app;
use app\interfaces\RequestInterface;
use app\interfaces\SendSmsInterface;
/**
* 实现接口
*/
class Request implements RequestInterface
{
public $id = 0 ;
}
class SendSmsService implements SendSmsInterface
{
public $name = "This is sendSmsSevice ";
}
namespace app\interfaces;
/**
* 接口类
* 解耦使用
*/
interface RequestInterface{}
namespace app\interfaces;
interface SendSmsInterface {}
namespace bpp;
/**
* 容器类
*/
class Container
{
public $register = [];
public function register(array $bind){
foreach($bind as $concrete){
if($concrete !instanceof Closure){
throw new Exception();
}
}
$this->register = array_merge($this->register , $bind) ;
}
}
namespace cpp;
use app\interfaces\RequestInterface;
use app\interfaces\SendSmsInterface;
/**
* 控制器
*/
class UserController
{
public function __construct()
{
}
public function test(RequestInterface $request , SendSmsInterface $sendSmsService){
var_dump($request->id);
var_dump("this is 依赖注入");
var_dump($sendSmsService->name);
}
}
namespace test;
use bpp\Container;
//实例化容器
$api = new Container();
//将依赖注册到容器
$api->register([
\app\interfaces\RequestInterface::class => \app\Request::class
]);
$api->register([
\app\interfaces\SendSmsInterface::class => \app\SendSmsService::class
]);
// 模仿路由
$router = "cpp\UserController@test";
$routers = explode("@",$router);
// 将 控制器 反射 出来
$ref = (new \ReflectionClass($routers[0]));
// 获取 控制器的 方法 里面的参数
$refs = $ref->getMethod($routers[1])->getParameters();
$inject = [];
foreach ($refs as $re){
//获取参数的类
$class = $re->getClass()->name;
// 在容器查询 是否注册过
if (array_key_exists($class , $api->register)){
// 获取 容器内注册的方法
$class = $api->register[$class];
//浅显易懂
$classes = $ref->newInstance();
$name = $routers[1];
$inject[] = new $class();
}else {
throw new \Exception("bug");
}
}
(new $classes())->{$name}(...$inject);
如果对你有帮助 麻烦点击关注我的csdn
https://blog.csdn.net/qq_3496...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。